﻿
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QldtSdh.BLL;
using QldtSdh.DAL.Models;
using QldtSdh.GUI.Utils;
using QldtSdh.Utils;

namespace QldtSdh.GUI.DuLieu
{
    public partial class FormQuanlyHocVien_Import : Form
    {
        class HocVien_Excel
        {
            public int SoThuTu { get; set; }
            public string HoDem { get; set; }
            public string Ten { get; set; }
            public string NgaySinh { get; set; }
            public bool GioiTinh { get; set; }
            public string QuocTich { get; set; }
            public string TrangThai { get; set; }
            public void SetInvalid(string trangThai)
            {
                IsValid = false;
                TrangThai = trangThai;
            }
            public bool IsValid { get; set; }
        }

        KhoaHoc khoahoc;
        NganhDaoTao nganh;
        LopKhoaNganh lopSelected;
        int entityToBeAdded = 0;
        public event Common.TListChangedEventHandler OnChanged;
        private QldtSdh.DAL.Models.CEMS4UG_DHKHContext m_DbContext = null;
        private QldtSdh.DAL.Models.CEMS4UG_DHKHContext DbContext
        {
            get
            {
                if (m_DbContext == null)
                    m_DbContext = QldtSdh.DAL.Models.CEMS4UG_DHKHContext.GetContext();
                return m_DbContext;
            }
        }

        private void ReleaseDbContext()
        {
            if (m_DbContext != null)
            {
                m_DbContext.Dispose();
            }
        }

        public FormQuanlyHocVien_Import(KhoaHoc khoahoc, NganhDaoTao nganh, LopKhoaNganh lopSelected)
        {
            InitializeComponent();
            this.khoahoc = khoahoc;
            this.nganh = nganh;
            this.lopSelected = lopSelected;
            LoadLop();
            LoadDotTuyenSinh();
        }

        void LoadLop()
        {
            if (khoahoc != null && nganh != null)
            {
                cmbLop.DataSource = BizLopKhoaNganh.GetList(khoahoc.MaKhoaHocGUID, nganh.MaNganhDaoTaoGUID);
                cmbLop.DisplayMember = "TenLopKhoaNganh";
                cmbLop.ValueMember = "MaLopKhoaNganhGUID";
            }
        }

        void LoadDotTuyenSinh()
        {
            cmbDotTuyenSinh.DataSource = BizDotTuyenSinh.GetList();
            cmbDotTuyenSinh.DisplayMember = "_Nam_DotTuyenSinh";
            cmbDotTuyenSinh.ValueMember = "MaDotTuyenSinhGUID";
        }

        private void lnkSelectFile_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var dlg = new OpenFileDialog();
            dlg.Title = "Chọn tệp Excel để nạp thông tin học viên...";
            dlg.Filter = "Tệp Excel (*.XLS)|*.xls";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtExcelFileName.Text = dlg.FileName;
                NapDanhSachBangTinh();
            }
        }

        private void lnkGetSheetList_Click(object sender, EventArgs e)
        {
            NapDanhSachBangTinh();
        }

        private void NapDanhSachBangTinh()
        {
            ep.Clear();
            var filename = txtExcelFileName.Text;
            if (string.IsNullOrEmpty(filename))
            {
                //DialogUtils.ShowError("Bạn phải chọn tệp Excel chứa danh sách các học phần ra đề thi");
                //return;
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Bạn chưa chọn tệp Excel");
                return;
            }
            try
            {
                var ei = new ExcelImporter(filename);
                var lstSheet = ei.GetSheetNameList();

                cbxSheet.Items.Clear();
                foreach (var sheet in lstSheet)
                    cbxSheet.Items.Add(sheet);

                if (lstSheet.Count > 0)
                {
                    cbxSheet.SelectedIndex = 0;
                }
            }
            catch (Exception exc)
            {
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Không thể nạp danh sách bảng tính\r\n" + exc.Message);
            }
        }

        private void btnReadSheetData_Click(object sender, EventArgs e)
        {
            #region var ei = new ExcelImporter() or return;
            ep.Clear();
            var filename = txtExcelFileName.Text;
            if (string.IsNullOrEmpty(filename))
            {
                //DialogUtils.ShowError("Bạn phải chọn tệp Excel chứa danh sách các học phần ra đề thi");
                ep.SetIconAlignment(lblExcelFilename, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblExcelFilename, "Bạn chưa chọn tệp Excel");
                return;
            }
            var ei = new ExcelImporter(filename);
            string sheetName = null;
            SheetName oSheetName = null;
            if (cbxSheet.SelectedItem != null)
                oSheetName = cbxSheet.SelectedItem as SheetName;
            if (oSheetName != null)
                sheetName = oSheetName.Name;
            if (string.IsNullOrEmpty(sheetName))
            {
                ep.SetIconAlignment(lblSheetname, ErrorIconAlignment.MiddleLeft);
                ep.SetError(lblSheetname, "Bạn chưa chọn bảng tính");
                return;
            }
            #endregion

            try
            {
                var maxSTT = -1;
                var startCell = txtStartCell.Text;
                var endCell = txtEndCell.Text;
                var dt = ei.ReadData(sheetName, startCell, endCell, headerEnable: false);
                var lsHocVien = new List<HocVien_Excel>();
                foreach (DataRow drow in dt.Rows)
                {
                    var stSTT = Convert.ToString(drow[0]);
                    if (string.IsNullOrEmpty(stSTT))
                        break;

                    int stt;
                    try
                    {
                        stt = Convert.ToInt32(stSTT);
                    }
                    catch (Exception exc)
                    {
                        continue;
                    }
                    if (stt > maxSTT) maxSTT = stt;
                    var hoDem = Convert.ToString(drow[1]);
                    var ten = Convert.ToString(drow[2]);
                    var gioiTinh = Convert.ToString(drow[3]);
                    var ngaySinh = Convert.ToString(drow[4]);
                    var quocTich = Convert.ToString(drow[5]);
                    var hocVienExcel = new HocVien_Excel()
                    {
                        SoThuTu = stt,
                        HoDem = hoDem.Trim(),
                        Ten = ten.Trim(),
                        GioiTinh = gioiTinh.Equals("nam", StringComparison.OrdinalIgnoreCase) ? true : false,
                        NgaySinh = ngaySinh,
                        QuocTich = quocTich,
                    };

                    var hocVien = this.DbContext.HocVienDbSet.Where(t =>
                       t.HoDem == hocVienExcel.HoDem &&
                       t.Ten == hocVienExcel.Ten && t.NgaySinh == hocVienExcel.NgaySinh).FirstOrDefault();
                    if (hocVien != null)
                    {
                        hocVienExcel.SetInvalid("Học viên này đã tồn tại");
                    }
                    else
                    {
                        hocVienExcel.IsValid = true;
                    }
                    lsHocVien.Add(hocVienExcel);
                }
                bsData.DataSource = new MySortableBindingList<HocVien_Excel>(lsHocVien);
                gridData.AutoGenerateColumns = false;
                gridData.DataSource = bsData;
                if (lsHocVien == null || lsHocVien.Count == 0)
                    btnSave.Enabled = false;
                else
                    btnSave.Enabled = true;
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError("Xuất hiện lỗi trong quá trình đọc dữ liệu.\nChi tiết lỗi: " + exc);
            }
        }

        private DataGridViewCellStyle m_StrikeoutStyle = null;

        private DataGridViewCellStyle StrikeoutStyle
        {
            get
            {
                if (m_StrikeoutStyle == null)
                {
                    m_StrikeoutStyle = new DataGridViewCellStyle(gridData.DefaultCellStyle);
                    m_StrikeoutStyle.Font = new Font(m_StrikeoutStyle.Font, FontStyle.Strikeout);
                    m_StrikeoutStyle.ForeColor = Color.Gray;
                }
                return m_StrikeoutStyle;
            }
        }

        private void gridHocPhanThi_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int i = 0; i < gridData.Rows.Count; i++)
            {
                DataGridViewRow dgrow = gridData.Rows[i];
                var hv = dgrow.DataBoundItem as HocVien_Excel;
                if (hv.IsValid)
                {
                    for (int j = 1; j <= 6; j++)
                        dgrow.Cells[j].Style = null;
                }
                else
                {
                    for (int j = 1; j <= 6; j++)
                        dgrow.Cells[j].Style = StrikeoutStyle;
                }
            }
        }

        bool ValidateData()
        {
            ep.Clear();
            if (cmbLop.SelectedIndex == -1)
            {
                ep.SetError(cmbLop, "Bạn chưa chọn lớp");
                return false;
            }
            if (cmbDotTuyenSinh.SelectedIndex == -1)
            {
                ep.SetError(cmbLop, "Bạn chưa chọn đợt tuyển sinh");
                return false;
            }
            return true;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            #region Kiểm tra tính hợp lệ của dữ liệu
            ep.Clear();
            if (bsData.DataSource == null)
            {
                ep.SetError(btnSave, "Chưa có dữ liệu");
                return;
            }
            #endregion
            if (!ValidateData())
                return;
            var lsHocVien = bsData.DataSource as MySortableBindingList<HocVien_Excel>;
            if (lsHocVien == null)
                return;
            var context = this.DbContext;

            var nSaved = 0;
            foreach (var hv in lsHocVien)
            {
                var trangthai = hv.IsValid;
                if (trangthai == false)
                    continue;
                try
                {
                    var hocVien = this.DbContext.HocVienDbSet.Where(t =>
                        t.HoDem == hv.HoDem &&
                        t.Ten == hv.Ten && t.NgaySinh == hv.NgaySinh).FirstOrDefault();
                    if (hocVien != null)
                        throw new Exception("Đã tồn tại học viên này");

                    hocVien = new HocVien();
                    int defOrder = 0;
                    HocVien hvtemp = null;
                    do
                    {
                        defOrder++;
                        hocVien.MaHocVien = BizHocVien.GenerateIDHocVien(khoahoc.NamTuyenSinh, nganh.MaNganhDaoTao, defOrder);
                        hvtemp = context.HocVienDbSet.Where(t => t.MaHocVien == hocVien.MaHocVien).FirstOrDefault();
                    } while (hvtemp != null);
                    NhatKyHoatDong nhatKy = new NhatKyHoatDong();
                    BizNhatKyHoatDong.InitData<HocVien>(nhatKy, hocVien, hocVien.MaHocVien, LOAIDOITUONG.HỌC_VIÊN, LOAITHAOTAC.Chỉnh_sửa);
                    hocVien.HoDem = hv.HoDem;
                    hocVien.Ten = hv.Ten;
                    hocVien.NgaySinh = hv.NgaySinh;
                    hocVien.GioiTinh = hv.GioiTinh;
                    hocVien.QuocTich = hv.QuocTich;
                    hocVien.MaLopKhoaNganhGUID = cmbLop.SelectedValue.ToString();
                    hocVien.MaDotTuyenSinhGUID = cmbDotTuyenSinh.SelectedValue.ToString();
                    context.HocVienDbSet.Add(hocVien);
                    context.SaveChanges();
                    BizNhatKyHoatDong.Add<HocVien>(nhatKy, hocVien);
                    entityToBeAdded++;
                    nSaved++;
                }
                catch (Exception exc)
                {
                    var st = string.Format("Xuất hiện lỗi khi lưu học viên {0} {1}, ngày sinh: {2}.\nChi tiết lỗi: {3}", hv.HoDem, hv.Ten, hv.NgaySinh, exc.Message);
                    DialogUtils.ShowError(st);
                }
            }
            OnChanged(this, null);
            DialogUtils.ShowMessage(string.Format("Đã lưu {0}/{1} học viên vào hệ thống", nSaved, lsHocVien.Count));
        }

        private void FormQuanLyHocVien_Import_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.ReleaseDbContext();
            if (entityToBeAdded > 0)
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }
    }
}
